package vip.george.dynamic.jdkproxy.handler;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;


/**
 * @author george
 *
 * 动态代理处理器
 */
public class LoggingHandler implements InvocationHandler {


    /**
     * 被代理的对象
     */
    private Object target;

    /**
     * 构造方法，传入被代理的对象
     * @param target
     */
    public LoggingHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 前置处理
        System.out.println("【日志】开始执行方法: " + method.getName());
        if (args != null) {
            System.out.println("【日志】方法参数: " + String.join(", ",
                    java.util.Arrays.stream(args).map(String::valueOf).toArray(String[]::new)));
        }

        long startTime = System.currentTimeMillis();

        // 调用实际方法(这里调用的是原始的方法)
        Object result = method.invoke(target, args);

        // 后置处理
        long endTime = System.currentTimeMillis();
        System.out.println("【日志】方法执行完成，耗时: " + (endTime - startTime) + "ms");
        System.out.println("【日志】返回结果: " + result);
        System.out.println("--------------------------------------------------------------------------------");
        return result;
    }


//    /**
//     * 获取代理对象
//     * @return
//     */
//    public Object getProxy() {
//        // 创建代理对象
//        return Proxy.newProxyInstance(
//                Thread.currentThread().getContextClassLoader(), // 类加载器
//                target.getClass().getInterfaces(), // 代理接口数组
//                this // 调用处理器
//        );
//    }

}
